
package com.example.hjlquickstartdemo.utils;


import com.example.hjlquickstartdemo.exception.IErrorCode;
import com.example.hjlquickstartdemo.pojo.vo.ResultResponse;

/**
 * 给前端统一返回数据工具类
 * @author HeJiaLe
 * @date 2023/07/17 14:41
 */


public class ResultResponseUtils {

    private ResultResponseUtils() {
    }

    public static final String CODE_SUCCESS = "0";
    public static final String CODE_FAILED = "-1";

    /**
     *  构建无body的成功应答
     * @return 返回的数据可以是任意类型包括空
     * @since  v1.0.0
     */
    public static <T> ResultResponse<T> success() {
        return ResultResponse.<T>builder()
                .withCode(CODE_SUCCESS)
                .build();
    }

    /**
     *  构建成功应答
     * @param  body 返回的数据可以是任意类型包括空
     * @param <T>
     * @return 返回的数据可以是任意类型包括空
     */
    public static <T> ResultResponse<T> success(T body) {
        return ResultResponse.<T>builder()
                .withCode(CODE_SUCCESS)
                .withBody(body)
                .build();
    }

/**
 * ===================================以下是失败应答===================================================
 */
    /**
     *  构建失败应答 指定-> 错误消息
     * @param  message
     * @return 统一应答体
     */
    public static <T> ResultResponse<T> failed(String message) {
        return ResultResponse.<T>builder()
                .withCode(CODE_FAILED)
                .withMessage(message)
                .build();
    }


    /**
     *  构建失败应答 指定-> 错误码 body  错误消息
     * @param code 错误码
     * @param body  错误应答body 任意类型
     * @param message 错误消息
     * @param <T>
     * @return 统一应答体
     */
    public static <T> ResultResponse<T> failed(String code, T body, String message) {
        return ResultResponse.<T>builder()
                .withCode(code)
                .withBody(body)
                .withMessage(message)
                .build();
    }

    /**
     *  构建失败应答  指定-> 错误码  错误信息
     * @param code 错误码
     * @param message  消息
     * @param <T>
     * @return 统一应答体
     */
    public static <T> ResultResponse<T> failedWithMsg(String code, String message) {
        return ResultResponse.<T>builder()
                .withCode(code)
                .withMessage(message)
                .build();
    }

    /**
     * 构建失败应答  指定-> IErrorCode错误码
     * @param errorCode  包含了错误和消息
     * @param <T>
     * @return 统一应答体
     */
    public static <T> ResultResponse<T> failed(IErrorCode errorCode) {
        return ResultResponse.<T>builder()
                .withCode(String.valueOf(errorCode.getCode()))
                .withBody(null)
                .withMessage(errorCode.getMessage())
                .build();
    }

    /**
     *  构建成功或者失败应答  指定-> 结果（boolean）
     * @param result  返回的数据可以是任意类型包括空
     * @return 公共应答前端通过应答码可知业务是成功还是失败
     */
    public static ResultResponse<Boolean> booleanResult(Boolean result) {
        String resultCode=result.booleanValue() ? CODE_SUCCESS : CODE_FAILED;
        return ResultResponse.<Boolean>builder()
                .withCode(resultCode)
                .withBody(result)
                .withMessage(result.booleanValue() ? "操作成功" : "操作失败")
                .build();
    }

}
